/*
 * 英才汇硕信息科技有限公司 拥有本软件版权 2021 并保留所有权利。
 * Copyright 2021, YCHS Information&Science Techology Co.,Ltd,
 * All right reserved.
 */
package com.ychs.lawyerback.util;


import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Value;

import org.springframework.stereotype.Component;

import java.security.Key;
import java.util.Date;
import java.util.Map;

/**
 * @author mayujing
 * @version 1.0
 * @ConfigurationProperties(prefix=)和@Component一起使用
 * @ConfigurationProperties 和@EnableConfigurationProperties
 */
@Component   // 交给Spring管理
public class JWTUtil {

    @Value("${jwt.secret}")  // 从配置文件中读取JWT密钥
    private String secret;

    @Value("${jwt.expire}")  // 从配置文件中读取过期时间
    private String expire;


    private Key key; // 加密用的密钥对象

    // 项目启动时把配置文件的密钥字符串转换成加密对象
    //初始化方法：对象初始化后自动执行这个方法
    @PostConstruct
    public void init() {
        // 生成HMAC-SHA512签名密钥
        key = Keys.hmacShaKeyFor(secret.getBytes());
    }
    //生成jwt，生成令牌：参数是用户ID和额外信息（比如用户名）
    public String generateToken(Long userId, Map<String, Object> claims){

//        Map<String,Object> claims = new HashMap<>();// 计算过期时间（当前时间 + 有效期）
        return Jwts.builder()
                .setClaims(claims)//设置自定义的负载 // 放入额外信息
                .setSubject(userId.toString())// 设置主体（subject）为用户ID// 放入用户ID
                .setIssuedAt(new Date(System.currentTimeMillis()))//签发时间（现在），令牌生成的当前时间
//                .setExpiration(new Date(System.currentTimeMillis()+expiration))//过期时间
                .signWith(key, SignatureAlgorithm.HS512)//使用HS512算法和密钥key进行签名
                .compact();// 压缩并生成最终令牌// 生成令牌字符串
    }

    // 验证JWT 是否过期，验证令牌是否有效（没过期、签名正确）
    public boolean validateToken(String token) {
        try {
            Claims claims = Jwts.parserBuilder()
                    .setSigningKey(key)
                    .build()
                    .parseClaimsJws(token)
                    .getBody();
            Date expirationDate = claims.getExpiration();

            return !expirationDate.before(new Date());
        } catch (JwtException | IllegalArgumentException e) {
            return false;
        }
    }

    // 从JWT中提取用户的id
    public String extractId(String token) {
        return Jwts.parserBuilder()
                .setSigningKey(key)
                .build()
                .parseClaimsJws(token)
                .getBody()
                .getSubject();
    }
    /**
     * 从令牌中提取所有负载信息
     * @param token 令牌
     * @return 包含所有负载的 Claims 对象
     */
    private Claims extractAllClaims(String token) {
        return Jwts.parserBuilder()
                .setSigningKey(key)
                .build()
                .parseClaimsJws(token)
                .getBody();
    }
}
